/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package Persistencia;
import Clases.*;


import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.ResultSet;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.swing.JOptionPane.*;

/**
 *
 * @author Jerónimo Trigueros Vera
 */
public class PersistenciaFactura {

    public static int insertarFactura(Factura factura){
        DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
        String fechaAlta = df.format(factura.getFecha()); 
        ArrayList<LineaServicioFactura> lineas = factura.getLineas();
        String sql = "insert into factura (codigoserie, codigo, codigocliente, nif, fecha, retencion, descripcioniva, totalbaseimponible, totalfactura, enviado)";                                     
        int insertado = 0;


        Connection con  = null;
        Statement st = null;
        try{

            
            sql += " values ('"+factura.getSerieFacturacion().getSerie()+"','"+factura.getCodigo()+"',"
                    + "'"+factura.getFacturacionCliente().getCliente().getCodigoCliente()+"','"+factura.getFacturacionCliente().getNif()+"','"+fechaAlta+"',"+factura.getRetencion()*100+",'"+factura.getTipoIva().getDescripcion()+"',"+factura.getTotalBaseImponible()+","+factura.getTotalFactura()+","+factura.isEnviado()+")" ;     
            
            con = Conexion.getConexion();
            st = (Statement) con.createStatement();
            insertado = st.executeUpdate(sql);
               
            if(!lineas.isEmpty())
            {
            for(LineaServicioFactura linea:lineas)
            {                
                String sql2 = "insert into lineaserviciofactura (codigofactura, nombreservicio, cantidad, precio, totallinea)";
                sql2 += "values ('"+factura.getCodigo()+"','"+linea.getServicio().getNombre()+"',"+linea.getCantidad()+","+linea.getPrecioUnidad()+","+linea.getTotalLinea()+")";
                insertado = st.executeUpdate(sql2);
            }
            }
            
            st.close();
        }
        catch(Exception e){
            System.out.println("Error al insertar la nueva factura "+e.getMessage());
            
        }
        finally{
            Conexion.cerrarConexion(con);
        }
        return insertado;
    }

    public static Factura obtenerFactura(String codigoFactura) throws SQLException{
 
        String sql= "select * from factura where codigo = '"+codigoFactura+"'";
        String descripcionIVA = null;
        String serieFactura = null;
        float retencionF = 0;        
        //System.out.println(sql);
        Connection con = null;
        Statement st = null;
        Statement st2 = null;        
        Statement st3 = null;
        Statement st4 = null;
        Statement st5 = null;        
        
        ResultSet rs = null;
        ResultSet rs2 = null;
        ResultSet rs3 = null;
        ResultSet rs4 = null;
        ResultSet rs5 = null;
        Cliente cliente = null;
        TiposIva tipoIVA = new TiposIva();
        SFacturacion serieFacturacion = new SFacturacion();
        ArrayList<LineaServicioFactura> lineas = new ArrayList();
        Factura factura = null;
        Date fechaF = null;
        String codCliente=null;
        String nif=null;
        boolean enviado = false;
             


        
        try{
            con = Conexion.getConexion();
            st = con.createStatement();
            rs = st.executeQuery(sql);
            if(rs.next()){
                
                fechaF = rs.getDate("fecha");
                retencionF = rs.getFloat("retencion");
                descripcionIVA = rs.getString("descripcioniva");
                serieFactura = rs.getString("codigoserie");
                enviado = rs.getBoolean("enviado");
                codCliente = rs.getString("codigocliente");
                nif = rs.getString("nif");
                rs.close();
                st.close();
            }
                String sql2 = "select porcentaje from tiposiva where descripcion = '"+descripcionIVA+"'";
                
                st2 = con.createStatement();
                rs2 = st2.executeQuery(sql2);  
                //obtengo el objeto tiposIVA
                if(rs2.next())
                {
                    tipoIVA.setDescripcion(descripcionIVA);
                    tipoIVA.setPorcentaje(rs2.getFloat("porcentaje"));
                }
                rs2.close();
                st2.close();
                
                //obtengo el objeto SFcaturación

                String sql3 = "select * from sfacturacion where serie = '"+serieFactura+"'";
                st3 = con.createStatement();
                rs3 = st3.executeQuery(sql3) ;
                if(rs3.next())
                {
                    serieFacturacion.setSerie(rs3.getString("serie"));
                    serieFacturacion.setCodigo(rs3.getString("codigo"));
                    serieFacturacion.setDescripcion(rs3.getString("descripcion"));
                }
                
                /*
                //obtengo el objeto Cliente y lo añado a la nueva factura
                String sql4 = "select * from cliente where codigo in (select codigocliente from factura where codigo = '"+codigoFactura+"')";
                rs3.close();
                st3.close();

                st4 = con.createStatement();                
                rs4 = st4.executeQuery(sql4);
                if(rs4.next())
                {
                        cliente = new Cliente(rs4.getString("codigo"), rs4.getString("nombre"), rs4.getString("nif"),
                        rs4.getString("email"), rs4.getString("personacontacto"), rs4.getString("movil"), rs4.getString("telefono1"),
                        rs4.getString("telefono2"), rs4.getString("fax"), rs4.getString("direccion"), rs4.getString("provincia"),
                        rs4.getString("localidad"), rs4.getString("cp"), rs4.getString("observacion"), rs4.getInt("estado"));
                    
                }
                rs4.close();
                st4.close();*/
                
                //obtengo el objeto FacturacionCliente
                FacturacionCliente fc = PersistenciaFacturacionCliente.obtenerFacturacionCliente(codCliente, nif); 
                
                //obtengo la lista de objetos tipo LineaServicioFatura que a su vez, cada una incluye un objeto Servicio
                String sql5 = "select * from lineaserviciofactura where codigofactura = '" + codigoFactura + "'";
                st5 = con.createStatement();                
                rs5 = st5.executeQuery(sql5);
                while(rs5.next())
                {                    
                    Servicio s = PersistenciaServicio.obtenerServicio(rs5.getString("nombreservicio")) ;
                    float c = rs5.getFloat("cantidad");
                    float p = rs5.getFloat("precio");
                    lineas.add(new LineaServicioFactura(s,c,p));
                }
                rs5.close();
                st5.close();
                factura = new Factura(fc, serieFacturacion, codigoFactura, fechaF, tipoIVA, retencionF, lineas, enviado);
                
                                              
        }
        catch(Exception e){
            System.out.println("Error al obtener la factura "+e.getMessage());
        }
        finally{
            Conexion.cerrarConexion(con);
        }
        return factura;        
    }
    
    public static int borrarFactura(String codigo) throws SQLException{
 
        Factura factura = obtenerFactura(codigo);
        ArrayList<Factura> lista = obtenerFacturas();
        int ret=0;
        
        if(!factura.isEnviado() && factura.equals(lista.get(lista.size()-1)))
        {    
            String sql= "delete from factura where codigo = '"+codigo+"'";
            String sql2= "delete from lineaserviciofactura where codigofactura = '"+codigo+"'";
            Connection con  = null;
            Statement st = null;
            try{
                con = Conexion.getConexion();
                st = con.createStatement();
                ret = st.executeUpdate(sql);
                ret = st.executeUpdate(sql2);
                st.close();
            }
            catch(Exception e){
                System.out.println("Error al borrar la factura "+e.getMessage());         
            }
            finally{
                Conexion.cerrarConexion(con);
            }      
        } 
        return ret;

        
        
    }
            


    

    public static ArrayList obtenerFacturas(){
        String codFactura;
        String sql = "select * from factura";
        Factura factura = null;
        ArrayList<Factura> lista = new ArrayList();
        Connection con = null;
        Statement st = null;
        ResultSet rs = null;

        try{
            con = Conexion.getConexion();
            st = con.createStatement();
            rs = st.executeQuery(sql);
            while(rs.next()){
                codFactura = rs.getString("codigo");
                factura = obtenerFactura(codFactura);
                lista.add(factura);
            }
            rs.close();
            st.close();            
        }

        catch(Exception e){
            System.out.println("Error al obtener todas las facturas "+e.getMessage());
        }
        return lista;
    }
    
    public static int modificarFactura(Factura f) throws SQLException {
        Connection con = null;
        Statement st = null;
        Statement st2 = null;
        DateFormat df = new SimpleDateFormat("yyyy-MM-dd");   
        int insertado;
        
        int ret = 0;



        try {
            con = Conexion.getConexion();
            st = con.createStatement();
            
        String sql = "update factura set "
                + "codigoserie = '" + f.getSerieFacturacion().getSerie() + "', "
                + "codigo = '" + f.getCodigo() + "', "
                + "codigocliente =  '" + f.getFacturacionCliente().getCodigoCliente() + "', "
                + "nif =  '" + f.getFacturacionCliente().getNif() + "', "
                + "fecha = '" + df.format(f.getFecha()) + "', "
                + "retencion = " + f.getRetencion() + ", "
                + "descripcioniva = '" + f.getTipoIva().getDescripcion() + "', "
                + "totalbaseimponible = " + f.getTotalBaseImponible() + ", "
                + "totalfactura = " + f.getTotalFactura() + ", "
                + "enviado = " + f.isEnviado() + " where codigo = '" + f.getCodigo() + "'";
            
            ret = st.executeUpdate(sql);  
            st.close();
            
            st2 = con.createStatement();            
        
            List<LineaServicioFactura> lineas = f.getLineas();            
            if(ret==1 && !lineas.isEmpty()){
                for(LineaServicioFactura linea:lineas)
                {   
                    LineaServicioFactura l = PersistenciaLineaFactura.obtenerLineaServicioFactura(f.getCodigo(), linea.getServicio().getNombre());
                    if(l!=null)
                    {
                    ret = PersistenciaLineaFactura.modificarLinea(f, linea);
                    }else {
                        ret = PersistenciaLineaFactura.insertarLineaServicioFactura(linea, f);
                    }
                }        
            }
        st2.close();  
            
        } catch (Exception e) {
            System.out.println("Error al modificar la factura" + e.getMessage());
        } finally {
            Conexion.cerrarConexion(con);
        }
        
        return ret;
    }    
    
    public static int correoFactura(String codigo) {

        int insertado = 0;
        Connection con = null;
        Statement st = null;
       
        String sql = "update factura set enviado = '1' where codigo = '" + codigo + "'" ;
        try {
            con = Conexion.getConexion();
            st = con.createStatement();
            insertado = st.executeUpdate(sql);

        } catch (Exception e) {
            System.out.println("Error al dar de  cliente" + e.getMessage());
        } finally {
            Conexion.cerrarConexion(con);
        }
        return insertado;

   } 
    
}
